<?php
use frontend\modules\yii2\widgets\layouts\markdown\Markdown;
use frontend\modules\yii2\widgets\layouts\example\Example;
use yii\bootstrap\Button;
use yii\bootstrap\Alert;

$this->title = '基于Yii官方发布的容器安装Yii2.0框架';
$this->registerMetaTag([
    'name' => 'keywords',
    'content' => 'yii,git,docker,Yii2,install,容器,镜像，框架,安装,教程,codelab,实操'
]);
$this->registerMetaTag([
    'name' => 'description',
    'content' => '介绍如何以Yiisoft官方发布的docker容器镜像安装Yii框架'
]);
$this->registerMetaTag([
    'name' => 'author',
    'content' => 'chenzhiwei'
]);

$breadcrumb = '基于Yii官方发布的容器安装Yii2.0框架';

$steps = [
    [
        "label" => "准备工作",
        "content" => <<<CODE
## 1. 准备工作
您需要一台安装有Docker的电脑或者服务器，我们建议您在Linux系统下进行本次实验。

### 1.1 安装Docker
Linux系统下请在命令行中执行如下的命令即可完成Docker的安装：
```shell
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
```

### 1.2 安装docker-compose
`docker-compose`是一个容器管理工具，可以批量管理您的容器组，由于Yii在框架源码中提供的容器服务是通过这个工具实现管理的，因此您也需要安装，如下是安装的命令：
```shell
# 下载文件
sudo curl -L "https://github.com/docker/compose/releases/download/v2.1.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# 设置文件可执行权限
sudo chmod +x /usr/local/bin/docker-compose

# 软连接
sudo link -s /usr/local/bin/docker-compose /usr/bin/docker-compose
```
CODE,
    ],[
        "label" => "下载Yii2.0框架",
        "content" => <<<CODE
## 2. 下载Yii2.0框架
我们需要Yii2.0框架中提供的`docker-compose.yml`文件，这个文件是Docker容器的编排文件，可以用`docker-compose`工具快速启动，因此我们首先需要下载Yii2.0框架：
```shell
git clone -b 2.0.43 https://github.com/yiisoft/yii2-app-advanced.git yii
```
上述命令拉取的框架源码并没有`vendor`目录和相关配置/入口文件，因此您需要对框架进行相关的初始化工作。我们也提供了已经初始化后的框架代码，您可以通过如下命令拉取：
```shell
git clone -b 2.0.43.1.1 https://gitee.com/lv_frame/yii.git yii
```

我们可以看一下`docker-compose.yml`文件：
```yaml
version: '3.2'

services:

  frontend:
    build: frontend
    ports:
      - 20080:80
    volumes:
      # Re-use local composer cache via host-volume
      - ~/.composer-docker/cache:/root/.composer/cache:delegated
      # Mount source-code for development
      - ./:/app

  backend:
    build: backend
    ports:
      - 21080:80
    volumes:
      # Re-use local composer cache via host-volume
      - ~/.composer-docker/cache:/root/.composer/cache:delegated
      # Mount source-code for development
      - ./:/app

  mysql:
    image: mysql:5.7
    environment:
      - MYSQL_ROOT_PASSWORD=verysecret
      - MYSQL_DATABASE=yii2advanced
      - MYSQL_USER=yii2advanced
      - MYSQL_PASSWORD=secret
```
上述文件描述了三个容器的创建配置：frontend/backend/mysql，并且frontend和backend容器依赖于各自目录下的`Dockerfile`文件，因此如果要保证正常安装容器组，需要保证如下三个文件的完整性和目录的有效性：
```shell
yii
├── backend
│   └── Dockerfile
├── frontend
│   └── Dockerfile
└── docker-compose.yml
```
CODE
    ],[
        "label" => "创建容器组",
        "content" => <<<CODE
## 3. 创建容器组
进入`docker-compose.yml`所在的目录，执行如下命令：
```shell
sudo /usr/local/bin/docker-compose up -d
```
如果你看到如下的输出，则表示容器组启动成功：
```shell
sudo docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Image}}"
CONTAINER ID   NAMES            IMAGE
9ce7ce6dd321   yii-mysql-1      mysql:5.7
898a462156ae   yii-frontend-1   yii_frontend
4e4ca1447394   yii-backend-1    yii_backend
```
上述容器中，您可以访问`yii-frontend-1`容器来访问前端资源，通过访问`yii-backend-1`容器访问后台服务，这两个容器使用的容器镜像其实都是一样的，通过`Dockerfile`文件可以知道：
```yaml
FROM yiisoftware/yii2-php:7.4-apache
```
在这个镜像中，Yii官方安装了`PHP7.4`作为运行Yii的PHP版本，安装了`apache`作为服务器代理实现访问，您可以通过
CODE
    ],[
        "label" => "初始化Yii框架",
        "content" => <<<CODE
## 4. 初始化Yii框架
如果您在第2步中拉取的框架代码是`2.0.43.1.1`版本，那说明框架代码已经完成了初始化工作，请跳过本节内容。

如果您拉取的Yii2.0框架源码没有`vendor`依赖包，也没有经过`./init`初始化，则需要进入容器进一步操作：
```shell
lvzmen:Desktop$ docker exec -it yii-frontend-1 /bin/bash
        _ _  __                                             _
       (_|_)/ _|                                           | |
  _   _ _ _| |_ _ __ __ _ _ __ ___   _____      _____  _ __| | __
 | | | | | |  _| '__/ _` | '_ ` _ \ / _ \ \ /\ / / _ \| '__| |/ /
 | |_| | | | | | | | (_| | | | | | |  __/\ V  V / (_) | |  |   <
  \__, |_|_|_| |_|  \__,_|_| |_| |_|\___| \_/\_/ \___/|_|  |_|\_\
   __/ |
  |___/

PHP version: 7.4.21
root@898a462156ae:/app#
```
### 4.1 下载依赖包
容器中已经自带了PHP依赖管理工具`composer`，因此您无需下载，在容器内的`/app`目录下执行如下命令拉取所需依赖包：
```shell
root@898a462156ae:/app# composer update
```

### 4.2 init初始化
拉取完依赖后还是无法运行Yii，因为框架中缺少了入口文件和配置文件，通过在容器内的`/app`目录下执行如下命令即可：
```shell
root@898a462156ae:/app# ./init
```
CODE
    ],[
        "label" => "完成安装",
        "content" => <<<CODE
## 5. 完成安装
恭喜您，到了这一步说明您已经完成了Yii的安装工作。

### 5.1 通过容器IP访问
想要访问容器内的Yii，需要先获得容器的IP，获取容器IP常用的有两种方法。 

如果您在宿主机，可以执行如下命令获得容器IP：
```shell
chenzhiwei:Desktop$ docker inspect yii-frontend-1 | grep IPA
            "SecondaryIPAddresses": null,
            "IPAddress": "",
                    "IPAMConfig": {
                    "IPAddress": "172.23.0.4",
```
如果您在容器内部，可以查看`/etc/hosts`文件获得容器IP:
```shell
root@898a462156ae:/app# cat /etc/hosts
127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.23.0.4      898a462156ae
```
容器ID（898a462156ae）所对应的就是容器的IP，得到容器IP后，我们就可以在浏览器中直接输入IP访问：
![通过容器IP直接访问容器内的Yii前台首页](/images/20211129144959.png "通过容器IP直接访问容器内的Yii前台首页")

### 5.2 通过端口访问
从`docker-compose.yml`文件得知，容器内部的`80`端口映射到了宿主机的`20080`端口，因此您可以通过宿主机的`20080`端口来访问容器的YII，假设`192.168.148.130`是你宿主机的IP，则可以通过如下访问：
![通过宿主机端口访问容器Yii前台首页](/images/20211129145620.png "通过宿主机端口访问容器Yii前台首页")

CODE

    ]
];

require "template.php";